﻿#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

//main106&107：堆内存的开辟和使用
int main106()
{
	//1.开辟堆空间存储数据；
	int* p = (int*)malloc(sizeof(int));
	printf("2.输出指针p的地址：%d\n", p);//20997536

	//3.使用堆空间；
	*p = 123;
	printf("4.输出堆空间指针p地址指向的内存空间：%d\n", *p);//123

	//5.释放堆空间；
	free(p);
	//9.为防止出现野指针，需要指向null；指向null后，下面的操作都不行了，操作就变成了肯定报错；
	p = NULL;

	//7.释放堆空间后，指针p就变成了野指针，操作p有可能报错，也可能不报错；
	/*printf("6.释放堆空间后，输出指针p的地址：%d\n", p);//20997536
	*p = 456;
	printf("8.输出野指针p地址指向的内存空间：%d\n", *p);//456*/

	system("pause");
	return EXIT_SUCCESS;
}
int main107(void)
{
	//10.开辟一个32M的内存空间；*10*10/3。两个G也是不行的，直接00000000；
	int* p = (int*)malloc(sizeof(int) * 8200000 * 10 * 10 / 3);
	//int* p = (int*)malloc(sizeof(int) * 8200000 * 66);
	printf("11.输出指针p的地址值，是开辟好的堆内存空间：%p\n", p);//00D16040-->00ED1040-->00000000-->012B1040
	free(p);

	//12.开辟一个40个字节大小的堆内存空间，存储数组；
	int* pArr = (int*)malloc(sizeof(int) * 10);
	//if (pArr == NULL)
	if (!pArr)
	{
		printf("13.开辟堆内存空间失败，程序异常！\n");
		return -1;
	}

	for (int i = 0; i < 10; i++)
	{
		pArr[i] = i;
	}
	for (int i = 0; i < 10; i++)
	{
		printf("14.指针p操作堆空间，则p指向的内存：%d\n", *(pArr + i));//0 1 2 ... 9
	}

	//15.释放堆内存，先判断，再释放；
	//if (pArr != NULL)
	if (pArr)
		free(pArr);

	//16.释放完成，变为空指针；
	pArr = NULL;

	return 0;
}